package com.huike.web.controller.Demo01_EasyExcel;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;

import java.util.ArrayList;
import java.util.List;

/**
 * @author BossSkill
 */
public abstract class ExcelHandler<T> extends AnalysisEventListener<T>
{
    /**
     * 每隔5条存储数据库，实际使用中可以3000条，然后清理list ，方便内存回收
     */
    private int BATCH_COUNT = 5;
    List<T> list = new ArrayList<T>();

    public ExcelHandler() {};
    public ExcelHandler(int bATCH_COUNT)
    {
        BATCH_COUNT = bATCH_COUNT;
    }

    /**重写该函数来处理数据*/
    public abstract void handle(List<T> dataList);

    @Override
    public void invoke(T data, AnalysisContext context)
    {
        list.add(data);
        // 达到BATCH_COUNT了，需要去存储一次数据库，防止数据几万条数据在内存，容易OOM
        if (list.size() >= BATCH_COUNT)
        {
            handle(list);
            // 存储完成清理 list
            list.clear();
        }
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext arg0)
    {
        // 这里也要保存数据，确保最后遗留的数据也存储到数据库
        handle(list);
    }

//可重写的方法：
//  处理一行数据
//	void invoke(T data, AnalysisContext context);
//  处理表头的一行数据
//	void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context)
//  获取单元格的额外信息
//	void extra(CellExtra extra, AnalysisContext context);
//  全部读取结束后的操作
//	void doAfterAllAnalysed(AnalysisContext context)
//  是否读取下一行
//	boolean hasNext(AnalysisContext context);
//  发生异常时调用
//	void onException(Exception exception, AnalysisContext context)

}
